/**
 * 
 */
package com.zhaotianhao.utils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: IOUtil
 * @Description: TODO(流工具类)
 */
public class IOUtil<T> {

    /**
     * @Title: closings
     * @Description: TODO(批量关闭流)
     * @param @param closeables
     * @param @throws Exception 参数
     * @return void 返回类型
     * @throws
     */
    public static void closings(AutoCloseable...  closeables) throws Exception {
        // 非空判断
        if (closeables != null) {
             // 循环关闭
             for (AutoCloseable auto : closeables) {
                 // 非空判断
                 if (auto != null) {
                      auto.close();
                 }
             }
        }
    }
    
    // 自定义编码格式和是否关闭流
    /**
     * @Title: asString
     * @Description: TODO(读取文本内容返回字符串)
     * @param @param inputStream
     * @param @param encode
     * @param @param isClose
     * @param @return
     * @param @throws Exception 参数
     * @return String 返回类型
     * @throws
     */
    public static String asString(InputStream inputStream,  String encode, boolean isClose) throws Exception {
    	StringBuffer sb = new StringBuffer();
    	//读取文本内容
    	InputStreamReader isr = new InputStreamReader(inputStream,encode);
    	//新建缓冲流
    	BufferedReader br = new BufferedReader(isr);
    	//循环读取
    	String con="";
    	while ((con=br.readLine())!=null) {
			sb.append(con);
		}
    	//判断是否关流
    	if (isClose) {
			br.close();
		}
    	return sb.toString();
     }
    
    // 自定义编码格式
    /**
     * @Title: readingLineFormTextFile
     * @Description: TODO(按行读取文本文件（返回List集合）)
     * @param @param FileName
     * @param @param encode
     * @param @return
     * @param @throws Exception 参数
     * @return List<String> 返回类型
     * @throws
     */
    public static List<String> readingLineFormTextFile(String  FileName, String encode) throws Exception {
         // 存放结果
         List<String> list = new ArrayList<String>();
         // 字符输入流
         FileReader fr = new FileReader(FileName);
         // 缓冲字符输入流
         BufferedReader br = new BufferedReader(fr);
         // 用于存入复制的数据
         String str = null;
         // 复制，如果读取的不为空，证明读取到了数据
         while ((str = br.readLine()) != null) {
              list.add(str);
         }
         // 关流
         closings(br);
         closings(fr);
         return list;
     }


    /**
     * @param FileName
     * @return
     * @throws Exception
     */
    public static<T> List<T> readingLineFormTextFile(String FileName, Class clazz,String split){
        // 存放结果
        List<T> list = new ArrayList<>();

        try {
            // 字符输入流
            FileReader fr = new FileReader(FileName);
            // 缓冲字符输入流
            BufferedReader br = new BufferedReader(fr);
            // 用于存入复制的数据
            String str = null;
            // 复制，如果读取的不为空，证明读取到了数据
            while ((str = br.readLine()) != null) {
                String[] src = str.split(split, -1);//分割数据
                T t = (T) clazz.newInstance();//反射创建对象
                Field[] fields = clazz.getDeclaredFields();//反射获取对象的所有属性
                for (int i=0; i<fields.length;i++) {
                    String type = fields[i].getType().toString();//获取属性的类型
                    fields[i].setAccessible(true);//打破私有封装
                    try{
                        if (type.endsWith("String")) {
                            fields[i].set(t,src[i]);
                            continue;
                        }else if(type.endsWith("int") || type.endsWith("Integer")){
                            fields[i].set(t,Integer.valueOf(src[i]));      //给属性设值
                            continue;
                        }else if(type.endsWith("double") || type.endsWith("Double")){
                            fields[i].set(t,Double.valueOf(src[i]));
                            continue;
                        }else if(type.endsWith("long") || type.endsWith("Long")){
                            fields[i].set(t,Long.valueOf(src[i]));
                            continue;
                        }else if(type.endsWith("BigDecimal")){
                            fields[i].set(t,new BigDecimal(src[i]));
                            continue;//......
                        }
                    }catch (Exception e){
                      e.printStackTrace();
                        continue;
                    }
                }
                list.add(t);
            }
            // 关流
            closings(br);
            closings(fr);

        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

}
